<?php
require_once APPLICATION_PATH.'/controllers/PedidoItem.php';

class PedidoCart implements SeekableIterator, Countable, ArrayAccess
{
    protected $_pedidoItems = array();
    protected $_posicion = 0;
    protected $_count;
    protected $_totalPedido = 0;
    protected $_totalCambio = 0;
    protected $_totalInventario = 0;
    protected $_porcentajeCambio = 0;
    protected $_sessionNamespace;
    
	public function __construct() {
        $this->_posicion = 0;
        $this->init();
    }
    
    public function init ()
    {
        $this->loadSession();
    }
    
	public function addItem ($idArticulo, $pedido, $cambio, $inventario, $precioArticulo)
    {

        $item = new PedidoItem($idArticulo, $pedido, $cambio, $inventario, $precioArticulo);
        $this->_pedidoItems[$item->getIdArticulo()] = $item;
        $this->persist();
        return $item;
    } 

	public function removeItem ($idArticulo)
    {
        if (is_int($idArticulo)) {
            unset($this->_pedidoItems[$idArticulo]);
        }
        $this->persist();
    }    

	public function persist()
	{
		$this->getSessionNs()->pedidoItems = $this->_pedidoItems;
	}    
    
    public function loadSession ()
    {
        if (isset($this->getSessionNs()->pedidoItems)) {
            $this->_pedidoItems = $this->getSessionNs()->pedidoItems;
        }
    }
    
	public function getSessionNs ()
    {
        if (null === $this->_sessionNamespace) {
            $this->setSessionNs(new Zend_Session_Namespace('CLIENTE'));
        }
        return $this->_sessionNamespace;
    } 
    
	public function setSessionNs(Zend_Session_Namespace $ns)
	{
		$this->_sessionNamespace = $ns;
	}       
    
	public function CalcularTotales()
    {
    	
    	$this->_totalPedido = 0;
    	$this->_totalCambio = 0;
    	$this->_totalInventario = 0;
    	
    	foreach ($this as $item) {
            $this->_totalPedido += $item->getCantidadPedido() * $item->getPrecioArticulo();
            $this->_totalCambio += $item->getCantidadCambio() * $item->getPrecioArticulo();
            $this->_totalInventario += $item->getCantidadInventario() * $item->getPrecioArticulo();
        }
    }
	
    
    
	
    /**
	 * @return the $_pedidoItems
	 */
	public function getPedidoItems() {
		return $this->_pedidoItems;
	}

	/**
	 * @return the $_totalPedido
	 */
	public function getTotalPedido() {
		return $this->_totalPedido;
	}

	/**
	 * @return the $_totalCambio
	 */
	public function getTotalCambio() {
		return $this->_totalCambio;
	}

	/**
	 * @return the $_totalInventario
	 */
	public function getTotalInventario() {
		return $this->_totalInventario;
	}

	/**
	 * @return the $_porcentajeCambio
	 */
	public function getPorcentajeCambio() {
		return $this->_porcentajeCambio;
	}

	/**
	 * @param field_type $_pedidoItems
	 */
	public function setPedidoItems($_pedidoItems) {
		$this->_pedidoItems = $_pedidoItems;
	}

	/**
	 * @param field_type $_totalPedido
	 */
	public function setTotalPedido($_totalPedido) {
		$this->_totalPedido = $_totalPedido;
	}

	/**
	 * @param field_type $_totalCambio
	 */
	public function setTotalCambio($_totalCambio) {
		$this->_totalCambio = $_totalCambio;
	}

	/**
	 * @param field_type $_totalInventario
	 */
	public function setTotalInventario($_totalInventario) {
		$this->_totalInventario = $_totalInventario;
	}

	/**
	 * @param field_type $_porcentajeCambio
	 */
	public function setPorcentajeCambio($_porcentajeCambio) {
		$this->_porcentajeCambio = $_porcentajeCambio;
	}

	/* (non-PHPdoc)
	 * @see SeekableIterator::seek()
	 */
    public function seek ($index)
    {
    	$this->rewind();
        $position = 0;

        while ($position < $index && $this->valid()) {
            $this->next();
            $position++;
        }

        if (!$this->valid()) {
            throw new Exception('Invalid seek position');
        }
    }
    /* (non-PHPdoc)
	 * @see SeekableIterator::current()
	 */
    public function current ()
    {
        return current($this->_pedidoItems);
    }
    /* (non-PHPdoc)
	 * @see SeekableIterator::next()
	 */
    public function next ()
    {
        return next($this->_pedidoItems);
    }
    /* (non-PHPdoc)
	 * @see SeekableIterator::key()
	 */
    public function key ()
    {
        return key($this->_pedidoItems);
    }
    /* (non-PHPdoc)
	 * @see SeekableIterator::valid()
	 */
    public function valid ()
    {
        return current($this->_pedidoItems) !== false;
    }
    /* (non-PHPdoc)
	 * @see SeekableIterator::rewind()
	 */
    public function rewind ()
    {
        return reset($this->_pedidoItems);
    }
    /* (non-PHPdoc)
	 * @see ArrayAccess::offsetExists()
	 */
    public function offsetExists ($key)
    {
        return isset($this->_pedidoItems[$key]);
    }
    /* (non-PHPdoc)
	 * @see ArrayAccess::offsetGet()
	 */
    public function offsetGet ($key)
    {
        return $this->_pedidoItems[$key];
    }
    /* (non-PHPdoc)
	 * @see ArrayAccess::offsetSet()
	 */
    public function offsetSet ($key, $value)
    {
        return $this->_pedidoItems[$key] = $value;
    }
    /* (non-PHPdoc)
	 * @see ArrayAccess::offsetUnset()
	 */
    public function offsetUnset ($key)
    {
        unset($this->_pedidoItems[$key]);
    }
    /* (non-PHPdoc)
	 * @see Countable::count()
	 */
    public function count ()
    {
        return count($this->_pedidoItems);
    }
    
    
}